/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pkgjeudestrategie;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JComponent;

/**
 *
 * @author Alexandre
 */
public class Batiment extends Zoomable {

    public enum TypeBatiment {
        CASERNE("Caserne",0,1000,1500,2000,3000,5000,0,0,0,0,0,40,60,100,120,150,0),
        HOTEL_DE_VILLE("Hotel de ville",1,1000,1500,2000,3000,5000,0,0,0,0,0,40,60,100,120,150,2),
        MARCHE("Marché",2,1000,1500,2000,3000,5000,1000,1500,2000,3000,5000,0,0,0,0,0,0),
        CAMP_DE_RECRUTEMENT("Camp de recrutement",3,1000,1500,2000,3000,5000,0,0,0,0,0,40,60,100,120,150,0),
        AEROPORT("Aeroport",4,1000,1500,2000,3000,5000,200,1000,1200,1300,15000,0,0,0,0,0,0),
        UNIVERSITE("Université",5,1000,1500,2000,3000,5000,0,0,0,0,0,100,200,400,600,1000,-4),
        THEATRE("Théatre",6,1000,1500,2000,3000,5000,0,0,0,0,0,40,60,100,120,150,10),
        LABORATOIRE("Laboratoire",7,1000,1500,2000,3000,5000,0,0,0,0,0,100,200,400,600,1000,0),
        HOPITAL("Hopital",8,1000,1500,2000,3000,5000,0,0,0,0,0,100,200,400,600,1000,0),
        VIDE("",9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
        private String toString;
        private int type;
        //cout de construction(tout identique pour l'instant)
        private int coutNv1;
        private int coutNv2;
        private int coutNv3;
        private int coutNv4;
        private int coutNv5;
        //il y a trois type de revenu:-aucun(le batiment ne crée aucun profit)
        //                            -faible(faire de l'argent n'est pas la fonction principale du batiment)
        //                            -élevé(le batiment existe uniquement pour faire des profits)
        private int revenuNv1;
        private int revenuNv2;
        private int revenuNv3;
        private int revenuNv4;
        private int revenuNv5;
        //il y a trois types de coût de maintenance: -aucun(le batiment engendre des profits)
        //                                           -faible(les batiments liés au bonheur de la population et à l'armée)
        //                                           -élevé(les batiments liés à la science)
        private int coutMaintenanceNv1;
        private int coutMaintenanceNv2;
        private int coutMaintenanceNv3;
        private int coutMaintenanceNv4;
        private int coutMaintenanceNv5;
        
        private int hapinessFactor;
        
        private TypeBatiment(String toString,int type, int coutNv1,int coutNv2,int coutNv3,int coutNv4,int coutNv5, int revenuNv1,int revenuNv2,int revenuNv3,int revenuNv4,int revenuNv5,int coutMaintenanceNv1,int coutMaintenanceNv2,int coutMaintenanceNv3,int coutMaintenanceNv4,int coutMaintenanceNv5,int hapinessFactor){
            this.toString=toString;
            this.type=type;
            this.coutNv1=coutNv1;
            this.coutNv2=coutNv2;
            this.coutNv3=coutNv3;
            this.coutNv4=coutNv4;
            this.coutNv5=coutNv5;
            this.revenuNv1=revenuNv1;
            this.revenuNv2=revenuNv2;
            this.revenuNv3=revenuNv3;
            this.revenuNv4=revenuNv4;
            this.revenuNv5=revenuNv5;
            this.coutMaintenanceNv1=coutMaintenanceNv1;
            this.coutMaintenanceNv2=coutMaintenanceNv2;
            this.coutMaintenanceNv3=coutMaintenanceNv3;
            this.coutMaintenanceNv4=coutMaintenanceNv4;
            this.coutMaintenanceNv5=coutMaintenanceNv5;
            this.hapinessFactor=hapinessFactor;
        }
        @Override
        public String toString() {
            //only capitalize the first letter
            String s = super.toString();
            if (s.equalsIgnoreCase("CASERNE")) {
                s = "Caserne";
            } else if (s.equalsIgnoreCase("HOTEL_DE_VILLE")) {
                s = "Hotel de ville";
            } else if (s.equalsIgnoreCase("MARCHE")) {
                s = "Marché";
            } else if (s.equalsIgnoreCase("CAMP_DE_RECRUTEMENT")) {
                s = "Camp de recrutement";
            } else if (s.equalsIgnoreCase("AEROPORT")) {
                s = "Aeroport";
            } else if (s.equalsIgnoreCase("UNIVERSITE")) {
                s = "Université";
            } else if (s.equalsIgnoreCase("THEATRE")) {
                s = "Théatre";
            } else if (s.equalsIgnoreCase("LABORATOIRE")) {
                s = "Laboratoire";
            } else if (s.equalsIgnoreCase("HOPITAL")) {
                s = "Hopital";
            }

            return s;
        }
    }
public TypeBatiment getRawType(){
    return type;
}
    public int getType() {
        int i = -1;
        if (type == TypeBatiment.CASERNE) {
            i = 0;
        } else if (type == TypeBatiment.HOTEL_DE_VILLE) {
            i = 1;
        } else if (type == TypeBatiment.MARCHE) {
            i = 2;
        } else if (type == TypeBatiment.CAMP_DE_RECRUTEMENT) {
            i = 3;
        } else if (type == TypeBatiment.AEROPORT) {
            i = 4;
        } else if (type == TypeBatiment.UNIVERSITE) {
            i = 5;
        } else if (type == TypeBatiment.THEATRE) {
            i = 6;
        } else if (type == TypeBatiment.LABORATOIRE) {
            i = 7;
        } else if (type == TypeBatiment.HOPITAL) {
            i = 8;
        }
        return i;
    }

    public enum NiveauBatiment {

        NIV_0(0), NIV_1(1), NIV_2(2), NIV_3(3), NIV_4(4), NIV_5(5);
private int lvl;
private NiveauBatiment(int lvl){
    this.lvl=lvl;
}
        @Override
        public String toString() {
            String s = super.toString();
            return s.substring(4).toLowerCase();
        }
    }
    private TypeBatiment type;
    private NiveauBatiment niv;
    private int position;
    boolean isUsed = false;
    boolean isActivated=false;
    boolean privatised=false;
    int upgradeInProgress=0;
    int numberOfPlayer=-1;
    //par défaut, l'emplacement est vide...

    public Batiment(TypeBatiment type, NiveauBatiment niv, int position,int nbPlayer) {
        this.type = type;
        this.niv = niv;
        this.position = position;
        this.numberOfPlayer=nbPlayer;

        /* 5 niveaux
         * Construire, Détruire, Privatiser, Nationaliser
         * Caserne, Hotel de ville, Marché, Camp de recrutement, Aéroport, Université,
         * Théatre, Laboratoire, Hopital, Emplacement vide (terrain vague)
         */

        setSize(400, 400);



    }
public int getProducedHapiness(){
    int bonus=0;
    try{bonus=type.hapinessFactor*niv.lvl;}catch(Exception e){}
    return bonus;
}
    public boolean isPrivatised(){
        return privatised;
    }

    public void detruire() {
        setType(9);
        niv = NiveauBatiment.NIV_0;
    }
public static String getDescription(int type, int i){
    String s="";
    if(type==0){
        if(i==0){s="La caserne permet de loger et d'améliorer l'armée.";}
        else if(i==1){s="Caserne";}
        else if(i==2){s="imagespi\\caserneIc.png";}
    }
    else if(type==1){
        if(i==0){s="L'hotel de ville permet une meilleur appliquation de la justice.";}
        else if(i==1){s="Hôtel de ville";}
        else if(i==2){s="imagespi\\justiceIc.png";}
    }
    else if(type==2){
        if(i==0){s="Le marché permet une meilleur croissance économique.";}
        else if(i==1){s="Marché";}
        else if(i==2){s="imagespi\\marcheIc.png";}
    }
    else if(type==3){
       if(i==0){ s="Le camp de recrutement permet d'accroître la vitesse de recrutement de soldats.";}
        else if(i==1){s="Camp de recrutement";}
        else if(i==2){s="imagespi\\recrutIc.png";}
        
    }
    else if(type==4){
       if(i==0){ s="L'aéroport permet une meilleur croissance économique, et la possibilité de construire des unités de combat aérien.";}
        else if(i==1){s="Aéroport";}
        else if(i==2){s="imagespi\\aeroportIc.png";}
        
    }
    else if(type==5){
        if(i==0){s="L'université permet d'améliorer la vitesse de développement technologique.";}
        else if(i==1){s="Université";}
        else if(i==2){s="imagespi\\universityIc.png";}
        
    }
    else if(type==6){
        if(i==0){s="Le théatre permet de rendre la population plus heureuse.";}
        else if(i==1){s="Théatre";}
        else if(i==2){s="imagespi\\theatreIc.png";}
        
    }
    else if(type==7){
        if(i==0){s="Le laboratoire permet de faire des recherches.";}
        else if(i==1){s="Laboratoire";}
        else if(i==2){s="imagespi\\laboIc.png";}
        
    }
    else if(type==8){
        if(i==0){s="L'hopital améliore le taux de croissance de la population et la réduction de pertes militaires.";}
        else if(i==1){s="Hopital";}
        else if(i==2){s="imagespi\\hopitalIc.png";}
        
    }
    if(i==0){
        s=s.substring(0,30)+"\n"+s.substring(30);
       if(s.length()>61) {s=s.substring(0,60)+"\n"+s.substring(60);}
        if(s.length()>91) {s=s.substring(0,90)+"\n"+s.substring(90);}
        if(s.length()>121) {s=s.substring(0,120)+"\n"+s.substring(120);}
    }
    return s;
}
    //nationaliser et privatiser peuvent attendre plusieurs semaines...
    public void privatiser(int i) {
        privatised=true;
    }

    public void nationaliser(int i) {
        privatised=false;
    }
    public static int getMoneyStats(int type,int i){
        int aMoneyStat=0;
        if(type==0){
            if(i==0){
                aMoneyStat=TypeBatiment.CASERNE.coutNv1;
            }
            else if(i==1){
                aMoneyStat=TypeBatiment.CASERNE.coutMaintenanceNv1;
                
            }
            else if(i==2){
                aMoneyStat=TypeBatiment.CASERNE.revenuNv1;
                
            }
        }
        else if(type==1) {
            if(i==0){
                aMoneyStat=TypeBatiment.HOTEL_DE_VILLE.coutNv1;
            }
            else if(i==1){
                aMoneyStat=TypeBatiment.HOTEL_DE_VILLE.coutMaintenanceNv1;
                
            }
            else if(i==2){
                aMoneyStat=TypeBatiment.HOTEL_DE_VILLE.revenuNv1;
                
            }
        }
        else if(type==2){
            if(i==0){
                aMoneyStat=TypeBatiment.MARCHE.coutNv1;
            }
            else if(i==1){
                aMoneyStat=TypeBatiment.MARCHE.coutMaintenanceNv1;
                
            }
            else if(i==2){
                aMoneyStat=TypeBatiment.MARCHE.revenuNv1;
                
            }
        }
        else if(type==3){
            if(i==0){
                aMoneyStat=TypeBatiment.CAMP_DE_RECRUTEMENT.coutNv1;
            }
            else if(i==1){
                aMoneyStat=TypeBatiment.CAMP_DE_RECRUTEMENT.coutMaintenanceNv1;
                
            }
            else if(i==2){
                aMoneyStat=TypeBatiment.CAMP_DE_RECRUTEMENT.revenuNv1;
                
            }
        }
        else if(type==4){
            if(i==0){
                aMoneyStat=TypeBatiment.AEROPORT.coutNv1;
            }
            else if(i==1){
                aMoneyStat=TypeBatiment.AEROPORT.coutMaintenanceNv1;
                
            }
            else if(i==2){
                aMoneyStat=TypeBatiment.AEROPORT.revenuNv1;
                
            }
        }
        else if(type==5){
            if(i==0){
                aMoneyStat=TypeBatiment.UNIVERSITE.coutNv1;
            }
            else if(i==1){
                aMoneyStat=TypeBatiment.UNIVERSITE.coutMaintenanceNv1;
                
            }
            else if(i==2){
                aMoneyStat=TypeBatiment.UNIVERSITE.revenuNv1;
                
            }
        }
        else if(type==6){
            if(i==0){
                aMoneyStat=TypeBatiment.THEATRE.coutNv1;
            }
            else if(i==1){
                aMoneyStat=TypeBatiment.THEATRE.coutMaintenanceNv1;
                
            }
            else if(i==2){
                aMoneyStat=TypeBatiment.THEATRE.revenuNv1;
                
            }
        }
        else if(type==7){
            if(i==0){
                aMoneyStat=TypeBatiment.LABORATOIRE.coutNv1;
            }
            else if(i==1){
                aMoneyStat=TypeBatiment.LABORATOIRE.coutMaintenanceNv1;
                
            }
            else if(i==2){
                aMoneyStat=TypeBatiment.LABORATOIRE.revenuNv1;
                
            }
        }
        else if(type==8){
            if(i==0){
                aMoneyStat=TypeBatiment.HOPITAL.coutNv1;
            }
            else if(i==1){
                aMoneyStat=TypeBatiment.HOPITAL.coutMaintenanceNv1;
                
            }
            else if(i==2){
                aMoneyStat=TypeBatiment.HOPITAL.revenuNv1;
                
            }
        }
        else if(type==9){
            if(i==0){
                aMoneyStat=TypeBatiment.VIDE.coutNv1;
            }
            else if(i==1){
                aMoneyStat=TypeBatiment.VIDE.coutMaintenanceNv1;
                
            }
            else if(i==2){
                aMoneyStat=TypeBatiment.VIDE.revenuNv1;
                
            }
        }
        return aMoneyStat;
    }
    public void setType(int i) {
        switch (i) {
            case 0:
                if (type == TypeBatiment.CASERNE) {
                    levelUp();
                } else {
                    type = TypeBatiment.CASERNE;
                }
                break;
            case 1:
                if (type == TypeBatiment.HOTEL_DE_VILLE) {
                    levelUp();
                } else {
                    type = TypeBatiment.HOTEL_DE_VILLE;
                }
                break;
            case 2:
                if (type == TypeBatiment.MARCHE) {
                    levelUp();
                } else {
                    type = TypeBatiment.MARCHE;
                }
                break;
            case 3:
                if (type == TypeBatiment.CAMP_DE_RECRUTEMENT) {
                    levelUp();
                } else {
                    type = TypeBatiment.CAMP_DE_RECRUTEMENT;
                }
                break;
            case 4:
                if (type == TypeBatiment.AEROPORT) {
                    levelUp();
                } else {
                    type = TypeBatiment.AEROPORT;
                }
                break;
            case 5:
                if (type == TypeBatiment.UNIVERSITE) {
                    levelUp();
                } else {
                    type = TypeBatiment.UNIVERSITE;
                }
                break;
            case 6:
                if (type == TypeBatiment.THEATRE) {
                    levelUp();
                } else {
                    type = TypeBatiment.THEATRE;
                }
                break;
            case 7:
                if (type == TypeBatiment.LABORATOIRE) {
                    levelUp();
                } else {
                    type = TypeBatiment.LABORATOIRE;
                }
                break;
            case 8:
                if (type == TypeBatiment.HOPITAL) {
                    levelUp();
                } else {
                    type = TypeBatiment.HOPITAL;
                }
                break;
            case 9:
                type = TypeBatiment.VIDE;
                break;

        }
        niv = NiveauBatiment.NIV_0;
        setUsed(true);
    }

    public void levelUp() {
        if(isActivated){
        if(upgradeInProgress==requiredTime()){
            if(niv == NiveauBatiment.NIV_0){
                niv = NiveauBatiment.NIV_1;
            }
            else if (niv == NiveauBatiment.NIV_1) {
            niv = NiveauBatiment.NIV_2;
        } else if (niv == NiveauBatiment.NIV_2) {
            niv = NiveauBatiment.NIV_3;
        } else if (niv == NiveauBatiment.NIV_3) {
            niv = NiveauBatiment.NIV_4;
        } else if (niv == NiveauBatiment.NIV_4) {
            niv = NiveauBatiment.NIV_5;}
        isActivated=false;
        upgradeInProgress=0;
        }
        else{
          upgradeInProgress++;  
        }}
    }
    public int getDepense(){
       try{ 
           if(niv.lvl==0){return type.coutNv1;}
        else if(niv.lvl==1){return type.coutNv2;}
        else if(niv.lvl==2){return type.coutNv3;}
        else if(niv.lvl==3){return type.coutNv4;}
        else if(niv.lvl==4){return type.coutNv5;}
        }catch(Exception e){}
       return 0;
        
    }
    public int getProfit(){
       try{ if(niv.lvl==1){return type.revenuNv1;}
        else if(niv.lvl==2){return type.revenuNv2;}
        else if(niv.lvl==3){return type.revenuNv3;}
        else if(niv.lvl==4){return type.revenuNv4;}
        else if(niv.lvl==5){return type.revenuNv5;}
        }catch(Exception e){}
       return 0;
    }
    public int getMaintenance(){
         try{ if(niv.lvl==1){return type.coutMaintenanceNv1;}
        else if(niv.lvl==2){return type.coutMaintenanceNv2;}
        else if(niv.lvl==3){return type.coutMaintenanceNv3;}
        else if(niv.lvl==4){return type.coutMaintenanceNv4;}
        else if(niv.lvl==5){return type.coutMaintenanceNv5;}
        }catch(Exception e){}
       return 0;
    }
    
    public int requiredTime(){
        //i doit correspondre au nombre de joueurs...il faut trouver un moyen de donner la playerList à Batiment (TOUT les batiments)
        int i=-1;
        if(niv == NiveauBatiment.NIV_0){
            i=numberOfPlayer;
            }
            else if (niv == NiveauBatiment.NIV_1) {
            i=2*numberOfPlayer;
                
        } else if (niv == NiveauBatiment.NIV_2) {
            i=3*numberOfPlayer;
            
        } else if (niv == NiveauBatiment.NIV_3) {
            i=4*numberOfPlayer;
            
        } else if (niv == NiveauBatiment.NIV_4) {
            i=5*numberOfPlayer;
            
        }
        return i;
    }
    public void activateConstruction(){
        
        isActivated=true;
        upgradeInProgress=0;
    }
    public boolean isActivated(){
        return isActivated;
    }
    //ne fonctionne pas
    public int getPercentageOfCompletion(){
        double d=((double) upgradeInProgress/requiredTime())*100;
        int x=(int) d;
        return x;
    }
    public NiveauBatiment getNiveau() {
        return niv;
    }

    public void setUsed(boolean b) {
        isUsed = b;
    }

    public boolean isUsed() {
        if (type == TypeBatiment.VIDE) {
            isUsed = false;
        } else {
            isUsed = true;
        }
        return isUsed;
    }
    @Override
    public String toString() {
        isUsed();
        String s = "Emplacement vide";
        if (isUsed) {
            s = type + " niv." + niv;
        }

        return s;
    }

    public void paintComponent(Graphics g) {
        g.setColor(Color.YELLOW);
        if (position == 1) {
            g.fillRect((int) ((getWidth()) / 2) - (int) (getWidth() * 0.20), (int) ((getWidth()) / 2) - (int) (getWidth() * 0.20), (int) (getWidth() * 0.15), (int) (getWidth() * 0.15));
        } else if (position == 2) {
            g.fillRect((int) ((getWidth()) / 2) + (int) (getWidth() * 0.05), (int) ((getWidth()) / 2) - (int) (getWidth() * 0.20), (int) (getWidth() * 0.15), (int) (getWidth() * 0.15));
        } else if (position == 3) {
            g.fillRect((int) ((getWidth()) / 2) - (int) (getWidth() * 0.20), (int) ((getWidth()) / 2) + (int) (getWidth() * 0.05), (int) (getWidth() * 0.15), (int) (getWidth() * 0.15));
        } else if (position == 4) {
            g.fillRect((int) ((getWidth()) / 2) + (int) (getWidth() * 0.05), (int) ((getWidth()) / 2) + (int) (getWidth() * 0.05), (int) (getWidth() * 0.15), (int) (getWidth() * 0.15));
        }

        
    }
}
